// class Container {
//   constructor(val) {
//     this._val = val;
//   }
//   map(fn) {
//     return new Container(fn(this._val));
//   }
// }

// let r = new Container(5).map(x => x + 1).map(x => x * x);
// console.log(r);

// 函子对象
// 函子是一个特殊的容器(对象)，这个容器内部封装一个值，通过 map 传递一个函数对值进行处理
class Container { // 以class的方式声明一个类 这个类就是一个函子
  static of(val) { // of 是方便得到一个函子实例 减少new 的使用 更函数化编程
    return new Container(val); 
  }

  constructor(val) {
    this._val = val;
  }

  map(fn) { // map接受一个函数 用这个函数处理实例中的_val并返回一个新的函子
    return Container.of(fn(this._val));
  }
}

let r = Container.of(5).map(x => x + 1).map(x => x * x);
console.log(r);